package com.eet.juc.queue;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 * 阻塞队列的四组API
 *
 * @author zheng.zhang
 */
public class BlockQueueDemo {

    public static void main(String[] args) throws InterruptedException {
        test4();
    }

    /**
     * 抛出异常
     */
    public static void test1() {
        // 定义一个初始容量为3的队列
        ArrayBlockingQueue<Object> queue = new ArrayBlockingQueue<>(3);

        /*
         * 放入三个元素正常
         */
        System.out.println(queue.add("a"));
        System.out.println(queue.add("b"));
        System.out.println(queue.add("c"));
        // System.out.println(queue.add("d")); 放入第四个元素抛出异常(IllegalStateException: Queue full)

        /*
         * 取出三个元素正常
         */
        System.out.println(queue.remove());
        System.out.println(queue.remove());
        System.out.println(queue.remove());
        // System.out.println(queue.remove()); 取出第四个元素抛出异常(NoSuchElementException)
    }

    /**
     * 有返回值,不抛出异常
     */
    public static void test2() {
        // 定义一个初始容量为3的队列
        ArrayBlockingQueue<Object> queue = new ArrayBlockingQueue<>(3);

        /*
         * 放入三个元素正常
         */
        System.out.println(queue.offer("a"));
        System.out.println(queue.offer("b"));
        System.out.println(queue.offer("c"));
        // 队列满了就会返回false
        System.out.println(queue.offer("d"));

        /*
         * 取出三个元素正常
         */
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        // 队列空了就会返回null
        System.out.println(queue.poll());
    }

    /**
     * 阻塞等待
     */
    public static void test3() throws InterruptedException {
        // 定义一个初始容量为3的队列
        ArrayBlockingQueue<Object> queue = new ArrayBlockingQueue<>(3);

        /*
         * 放入三个元素正常
         */
        queue.put("a");
        queue.put("b");
        queue.put("c");
        // queue.put("d"); 队列满了继续插入就会一直阻塞,程序不会停止

        System.out.println("<====================================>");
        /*
         * 取出三个元素正常
         */
        queue.take();
        queue.take();
        queue.take();
        // queue.take(); 队列空了就一直阻塞不会终止
    }

    /**
     * 超市等待
     */
    public static void test4() throws InterruptedException {
        // 定义一个初始容量为3的队列
        ArrayBlockingQueue<Object> queue = new ArrayBlockingQueue<>(3);

        /*
         * 放入三个元素正常
         */
        queue.offer("a");
        queue.offer("b");
        queue.offer("c");
        // 队列满了继续插入, 过了设置的超市时间就会终止
        queue.offer("d", 3, TimeUnit.SECONDS);

        System.out.println("<====================================>");
        /*
         * 取出三个元素正常
         */
        queue.poll();
        queue.poll();
        queue.poll();
        // 队列空了过了设置的超市时间就会终止
        queue.poll(3, TimeUnit.SECONDS);
    }
}
